package com.net.lnk.rpc.http.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.net.lnk.rpc.http.invoke.ConsumerConfig;
import com.net.lnk.rpc.http.invoke.HttpInvoker;
import com.net.lnk.rpc.http.invoke.Invoker;
import com.net.lnk.rpc.http.serialize.RpcFormater;
import com.net.lnk.rpc.http.serialize.json.JsonRpcFormater;

/**
 * 生成接口的代理对象，实现InvocationHandler接口处理代理调用
 */
public class ConsumerProxyFactory implements InvocationHandler {

	private ConsumerConfig consumerConfig;

	/**
	 * JSON格式化工具
	 */
	private RpcFormater formater = JsonRpcFormater.formater;

	/**
	 * HTTP通信
	 */
	private Invoker invoker = HttpInvoker.invoker;

	/**
	 * 被调用的接口，用来生产代理对象，真正的调用处理由InvocationHandler 的 invoke 处理
	 */
	private String interfaceClass;

	/**
	 * 创建调用代理实例
	 * @return
	 * @throws Exception
	 */
	public Object create() throws Exception {
		Class<?> clazz = Class.forName(interfaceClass);
		return Proxy.newProxyInstance(clazz.getClassLoader(), new Class[] { clazz }, this);
	}

	/**
	 * 代理调用
	 */
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Class<?> clazz = proxy.getClass().getInterfaces()[0];
		// 1.格式化调用请求成json字符串
		String request = formater.formatRequest(clazz, method.getName(), args);
		// 2.通过HTTP客户端发送调用请求并等待应答
		String response = invoker.invoke(request, consumerConfig);
		// 3.解析服务提供方的应答
		return formater.parseResponse(response);
	}

	public ConsumerConfig getConsumerConfig() {
		return consumerConfig;
	}

	public void setConsumerConfig(ConsumerConfig consumerConfig) {
		this.consumerConfig = consumerConfig;
	}

	public String getInterfaceClass() {
		return interfaceClass;
	}

	public void setInterfaceClass(String interfaceClass) {
		this.interfaceClass = interfaceClass;
	}

}
